从HTML中提取数据

2024-10-03 13:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个网站。我已经能够将网站上的内容放入一个字符串/文件中。在

现在,我想搜索一个特定的行,它包含以下内容:

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

有必要只有一个键1:在网站上,我需要得到值1。 最好的办法是什么。 如果它是通过正则表达式,你能帮我看看它应该是什么样子吗。我很少用正则表达式。在

谨致问候, 安姆


Tags: 文件key字符串内容value网站liclass
3条回答

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

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

然后可以在元素上使用.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

我不使用regex,而是让BeautifulSoup解析html。在

然后,您可以使用内置的find函数来搜索“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 

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

^{pr2}$

关键是让解析器将其转化为树导航问题,而不是定义不清的文本搜索问题。在

beauthoulsoup是一个单一的纯python文件,很容易添加到您的设置中。这是一个很受欢迎的选择。更复杂的选择包括html5lib和{a3}。标准库包括HTMLParser,但它有点过于简单,不能很好地处理格式错误的HTML。在

regex方法有点脆弱,但您可以尝试这样的方法(取决于数据通常的布局方式):

>>> 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'

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

相关问题 更多 >