使用Beautiful Soup

时间:2016-12-30 18:23:38

标签: python string python-2.7 parsing beautifulsoup

我正在使用Beautiful Soup在网站上搜索一组整数值,并生成一个与名称匹配的列表。但是,我遇到的问题是网站使用了一些非常模糊的类名来获取我需要的元素(“list-item”),这些元素在其他元素中被复制,我不想抓住它们。到目前为止,我的代码看起来像:

from bs4 import BeautifulSoup as bs
import requests

url = "http://beautifulnumberssite.com/"
html = requests.get(url).text
soup = bs(html)

names = soup.findAll("h1", class_="th1")
stats = soup.findAll("li", class_="list-item")

print(names, stats)

然而,这也是我不想要的一大堆东西。有没有办法让它如此美丽的汤只返回元素的内容,后面跟着某个字符串?因此,如果网页包含类似的部分:

<li class='list-item'>
<strong>65</strong>
Important Values
</li>
<li class='list-item'>
<strong>49</strong>
Useless Values
</li>

我希望能够设置Beautiful Soup / Python来解析像“重要值”这样的字符串并直接获取元素(忽略任何换行符或空格),或者更好的是包含在其中的值元素。所以在这种情况下,Beautiful Soup会打印出来:

<strong>65</strong>

或者更优选地,只是:

65

这可能吗?

2 个答案:

答案 0 :(得分:0)

只需迭代您的类元素并检查其内容是否与您的重要字符串匹配:

for listItem in soup.findAll('li', class_='list-item'):
    if listItem.decode_contents(formatter="html").find('Important Values') != -1:
        print(listItem.find('strong').contents)        

答案 1 :(得分:0)

  

我希望能够设置Beautiful Soup / Python来解析像#34;重要值&#34;这样的字符串。并在它之前直接获取元素(忽略任何换行符或空格),或者更好的是元素中包含的值

BeautifulSoup在定位元素方面非常灵活。有各种各样的技术可以在HTML中找到元素。在这种情况下,我们可以找到&#34;重要值&#34;文本节点并找到preceding strong element

important_values = int(soup.find(text=lambda text: text and text.strip() == 'Important Values').find_previous_sibling("strong").get_text())
print(important_values)  # prints 65

或者,我们可以创建"search function"并检查strong元素名称和下一个文本同级节点是否为&#34;重要值&#34;:

def search_function(tag):
    is_strong = tag.name == "strong"
    is_important = tag.next_sibling and tag.next_sibling.strip() == 'Important Values'
    return is_strong and is_important

important_values = int(soup.find(search_function).get_text())
print(important_values)  # prints 65