Beautifulsoup无法从<script type =“ text / javascript”>中提取信息

时间:2019-10-28 00:13:58

标签: python web-scraping beautifulsoup

我需要一种从网页获取信息的方法。该信息存储在<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; 

1 个答案:

答案 0 :(得分:0)

如果您想要标签中的文本,则不能仅将'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;']