Beautifulsoup不能从]中提取信息,

问题描述 投票:0回答:1

我需要一种从网页获取信息的方法。该信息存储在<script>标记中,我找不到提取它的方法。这是我使用的代码的最后一次迭代。

for link in urls:
    driver.get(link)
    #print(driver.title)
    content = driver.page_source
    soup = BeautifulSoup(content, features="html.parser")
    for a in soup.findAll(string=['script', "EM.", "productFullPrice"]):
        print (a)
        name=a.find(string=['EM.sef_name'])
        print(name);

print(a)和print(name)不返回任何内容。

我要抓取的源代码如下:

 <script type="text/javascript">
        var EM = EM || {};
        EM.CDN = 'link1';
        EM.something = value; 

我需要一种从网页获取信息的方法。该信息存储在

如果您想在标记中添加文本,则不能仅将'EM'传递给string标记,因为它正在寻找与'EM'完全匹配的字符串。这也意味着它也不会与script标签匹配,而只会在标签本身内部查找字符串script。要获得该节点,您需要将script作为节点传递给findAll函数。如果您查看script标记之间的内容的文本值,则它看起来像"\n var EM = EM || {};\n EM.CDN = 'link1';\n EM.something = value; \n "。因此找不到EM,因为EM不等于我在上面发布的那个字符串。有几种方法可以解决此问题,这是我选择的一种方法,用于帮助返回类似于您发布的值:

import bs4
html_string = '''
 <script type="text/javascript">
        var EM = EM || {};
        EM.CDN = 'link1';
        EM.something = value; 
 </script>
'''
wanted_strings= string=["EM.", "productFullPrice"]
soup = bs4.BeautifulSoup(html_string, features="html.parser")
wanted=[]
test = soup.findAll('script')
for word in wanted_strings:
    for tag in test:
        if word in tag.text:
            wanted.append(tag)
wanted

然后它将在这样的列表中为您提供脚本行,其中包含包含所需字符串的标签

[<script type="text/javascript">
         var EM = EM || {};
         EM.CDN = 'link1';
         EM.something = value; 
  </script>]

另一种方法是只寻找标签,然后将每一行代码放在列表中

import bs4
html_string = '''
 <script type="text/javascript">
        var EM = EM || {};
        EM.CDN = 'link1';
        EM.something = value; 
 </script>
'''
soup = bs4.BeautifulSoup(html_string, features="html.parser")
test = soup.findAll('script')
blah = [x.strip() for x in test[0].text.split('\n') if x.strip()]
blah

这将为您提供类似这样的内容,根据您的用例,可能更容易搜索所需内容

['var EM = EM || {};', "EM.CDN = 'link1';", 'EM.something = value;']
python web-scraping beautifulsoup
1个回答
0
投票

如果您想在标记中添加文本,则不能仅将'EM'传递给string标记,因为它正在寻找与'EM'完全匹配的字符串。这也意味着它也不会与script标签匹配,而只会在标签本身内部查找字符串script。要获得该节点,您需要将script作为节点传递给findAll函数。如果您查看script标记之间的内容的文本值,则它看起来像"\n var EM = EM || {};\n EM.CDN = 'link1';\n EM.something = value; \n "。因此找不到EM,因为EM不等于我在上面发布的那个字符串。有几种方法可以解决此问题,这是我选择的一种方法,用于帮助返回类似于您发布的值:

© www.soinside.com 2019 - 2024. All rights reserved.