从HTML中提取数据

时间:2011-11-06 01:01:29

标签: python regex scrape

我正在试图抓一个网站。我已经能够将网站上的内容变成字符串/文件。

现在,我想搜索具有以下内容的特定行:

<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>

有一个关键1:在网站上我需要获得价值1。 这是最好的方法。 如果它通过正则表达式,你能帮我看看它应该是什么样子。我没有太多使用正则表达式。

此致 AMM

4 个答案:

答案 0 :(得分:5)

我不是使用正则表达式,而是让BeautifulSoup解析html。

然后,您可以使用内置的查找功能来搜索“abc”和“aom_pb”类。

import BeautifulSoup

soup = BeautifulSoup.BeautifulSoup(downloaded_str)
key = soup.find('span', {'class': 'abc'}).text
value = soup.find('span', {'class': 'aom_pb'}).text 

如果类标记不是唯一的,只需循环遍历它们,直到找到正确的标记:

for li in soup.findAll('li'):
    if li.find('span', attrs={'class': 'abc'}, text='Key 1:'):
        print li.find('span', {'class': 'aom_pb'}).text

关键是让解析器将其转换为树导航问题而不是错误定义的文本搜索问题。

BeautifulSoup是一个单纯的python文件,很容易添加到您的设置中。这是一个受欢迎的选择。更复杂的替代方案包括html5liblxml。标准库包含HTMLParser,但它有点过于简单,并且不能很好地处理格式错误的HTML。

正则表达式方法有点脆弱,但您可以尝试这样的方法(取决于数据的布局方式):

>>> s = '''<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>'''
>>> re.search(r'Key 1:.*?(Value .*?)<', s).group(1)
'Value 1'

答案 1 :(得分:4)

您应该使用lxml等解析器从HTML中提取数据。对这样的任务使用正则表达式是A Bad Ideatm

Lxml允许您使用XPath表达式来选择元素,在这种情况下,可以使用表达式//span[@class='abc' and text()='Key 1:']选择相关的“键”范围。此表达式只搜索整个树中span个元素,其类别为abc并包含确切的文本Key 1:

然后,您可以在元素上使用.getnext()来获取包含所需数据的以下元素。

以下是完全可以完成的事情:

import lxml.html as lh

html = """
<html>
<head>
    <title>Test</title>
</head>
<body>
<ul>
    <li><span class="abc">Key 3:</span>&nbsp;<span class="aom_pb">Mango</span></li>
    <li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Pineapple</span></li>
    <li><span class="abc">Key 2:</span>&nbsp;<span class="aom_pb">Apple</span></li>
    <li><span class="abc">Key 7:</span>&nbsp;<span class="aom_pb">Peach</span></li>
</ul>
</body>
</html>
"""

tree = lh.fromstring(html)

for key_span in tree.xpath("//span[@class='abc' and text()='Key 1:']"):
    print key_span.getnext().text

<强>结果:

Pineapple

答案 2 :(得分:2)

您不应该使用正则表达式来解析HTML。有一个用于python的HTML解析器模块,恰当地命名为HTMLParserhttp://docs.python.org/library/htmlparser.html

答案 3 :(得分:1)

另一种使用BeautifulSoup的方法:遍历&lt; li&gt;元素,并检查其中的&lt; span&gt;。

import BeautifulSoup

downloaded_str='''
<li><span class="abc">Key 0:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
<li><span class="abc">Key 1:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
<li><span class="abc">Key 2:</span>&nbsp;<span class="aom_pb">Value 1</span></li>
'''

soup = BeautifulSoup.BeautifulSoup(downloaded_str)
for li in soup.findAll('li'):
    span = li.find('span', {'class': 'abc'}, recursive=False)
    if span and span.text == 'Key 1:':
        return li.find('span', {'class': 'aom_pb'}, recursive=False).text