Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配HTML中标题后的项_Python_Html_Regex_Parsing - Fatal编程技术网

Python 正则表达式匹配HTML中标题后的项

Python 正则表达式匹配HTML中标题后的项,python,html,regex,parsing,Python,Html,Regex,Parsing,一个相当简单的正则表达式提取让我很困惑。找不到类似的问题,所以很高兴被指出来,如果它存在的话。给定以下HTML: 第一篇 标题二 (在较大的文档中-摘录很可能会跨越多行) 如何构造一个正则表达式,在H1后面的第一个p中查找a标记中的文本?正则表达式将进入一个循环,这样我就可以传入头,以便检索后面的项 ]*>([0-9.]+?)显然匹配标记中的所有项目(应该可以,因为标记不能连接),但我无法将它们绑定到H1 +Title One.+]*>([0-9.]+?)失败 我曾尝试使用“向后看”这样: (?

一个相当简单的正则表达式提取让我很困惑。找不到类似的问题,所以很高兴被指出来,如果它存在的话。给定以下HTML:

第一篇

标题二

(在较大的文档中-摘录很可能会跨越多行)

如何构造一个正则表达式,在H1后面的第一个p中查找a标记中的文本?正则表达式将进入一个循环,这样我就可以传入头,以便检索后面的项

]*>([0-9.]+?)
显然匹配标记中的所有项目(应该可以,因为标记不能连接),但我无法将它们绑定到H1

+Title One.+]*>([0-9.]+?)

失败

我曾尝试使用“向后看”这样:

(?([0-9.]+?)

和一些变体,但它仅允许用于固定宽度匹配(此处不允许)

在上下文中,这将使用Python的正则表达式引擎。我知道正则表达式不一定是解决这一问题的最佳解决方案,因此使用DOM或其他东西的替代建议也受到了欢迎:)


更新

>>> from lxml import etree
>>> from pprint import pprint
>>>
>>> data = """
... <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>
... <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
... """
>>>
>>> d = etree.HTML(data)
>>> #d.xpath('//h1[following-sibling::*[1][local-name()="p"]]') 
...
>>> results = {}
>>> for h in d.xpath('//h1[following-sibling::*[1][local-name()="p"]]'):
...   r = results.setdefault(str(h.text),[])
...   r += [ str(x) for x in h.xpath('./following-sibling::*[1][local-name()="p"]/a/text()') ]
...
>>> pprint(results)
{'Title One': ['40.5', '31.3'], 'Title Two': ['12.1', '82.0']}
为了澄清上述情况,我想回复以下内容:

{“标题一”:[“40.5”、“31.3”],“标题二”:[“12.1”、“82.0”}

(这并不是说我需要帮助编写字典,但它确实演示了我需要如何将值与标题关联起来)

到目前为止,漂亮的乌苏看起来是最好的。LXML可能也可以工作,因为源HTML不是真正的标记汤——它的结构非常好,至少在我感兴趣的地方是这样


不要使用正则表达式解析html。根据定义,这是不可能做到的。改用html解析器。我建议
lxml.html


lxml.html
比BeautifulSoup更好地处理格式不正确的html,并且被积极维护(BeautifulSoup不是),而且速度更快,因为它在内部使用了
libxml2

不要使用正则表达式解析html。根据定义,这是不可能做到的。改用html解析器。我建议
lxml.html


lxml.html
比BeautifulSoup更好地处理格式错误的html,并且被积极维护(BeautifulSoup不是),而且速度更快,因为它在内部使用了
libxml2

你是对的,regex绝对是html匹配的错误工具


然而,您的问题听起来与HTML解析器的问题完全相同,它可以处理不太完美的HTML。

您是对的,regex绝对是错误的HTML匹配工具


但是你的问题,,听起来很像一个HTML解析器的问题,它可以处理不太完美的HTML。

解决这个问题的另一个明显的答案是——我喜欢它处理你经常在野外遇到的那种糟糕的HTML,就像你所希望的那样理智而优雅。

解决这个问题的另一个明显的答案是——我就像这样,它可以处理你在野外经常遇到的那种蹩脚的html,就像你所希望的那样明智而优雅。

这里有一种使用普通字符串操作的方法

html='''
<h1 class="title">Title One</h1><p><a href="#">40.5</a>
<a href="#">31.3</a></p>
<h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
'''

for i in html.split("</a>"):
    if "<a href" in i:
        print i.split("<a href")[-1].split(">")[-1]

我实际上不明白您想要得到什么,但是如果您的要求很简单,是的,一个正则表达式或几个字符串就可以做到。这不需要解析器

这里有一种使用普通字符串操作的方法

html='''
<h1 class="title">Title One</h1><p><a href="#">40.5</a>
<a href="#">31.3</a></p>
<h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
'''

for i in html.split("</a>"):
    if "<a href" in i:
        print i.split("<a href")[-1].split(">")[-1]

我实际上不明白您想要得到什么,但是如果您的要求很简单,是的,一个正则表达式或几个字符串就可以做到。这不需要解析器

这就是你想要的东西吗

>>> from lxml import etree
>>>
>>> data = """
... <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>
... <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
... """
>>>
>>> d = etree.HTML(data)
>>> d.xpath('//h1/following-sibling::p[1]/a/text()')
['40.5', '31.3', '12.1', '82.0']

现在使用谓词向前看,这应该遍历紧跟着
标记的
标记。(将
tag.text
显式转换为字符串,因为我记得它们不是普通的字符串,你会很难对它们进行酸洗,等等)

这就是你想要的东西吗

>>> from lxml import etree
>>>
>>> data = """
... <h1 class="title">Title One</h1><p><a href="#">40.5</a><a href="#">31.3</a></p>
... <h1 class="title alternate">Title Two</h1><p><a href="#">12.1</a><a href="#">82.0</a></p>
... """
>>>
>>> d = etree.HTML(data)
>>> d.xpath('//h1/following-sibling::p[1]/a/text()')
['40.5', '31.3', '12.1', '82.0']

现在使用谓词向前看,这应该遍历紧跟着
标记的
标记。(显式地将
tag.text
转换为字符串,因为我记得它们不是普通字符串,您很难对它们进行酸洗,等等)

这将在服务器端代码或文档中的javascript中运行吗?这是针对独立的python脚本,而不是基于web的脚本。HTML只是源数据。您可以控制创建的HTML吗?您可以相信它会遵循任何通用格式吗?没有直接控制,但我可以相信它会很好地匹配上述格式。这会在服务器端代码或文档中的javascript中运行吗?这是用于独立的python脚本,实际上不是基于web的。HTML只是源数据。你能控制创建的HTML吗?你能相信它遵循任何通用格式吗?没有直接控制,但我可以相信它能很好地匹配上述格式。是的,尽管页面上还有其他H1元素,我需要知道哪些值与哪个标题匹配。如果您没有考虑XPATH,将进行调查,谢谢。如果您发布您正在解析的内容以及您需要的内容。我相信有人可以用xpath为您指出正确的方向。很抱歉,我花了这么长时间才回到这里,但这太棒了,正是我所需要的:)我花了大约一个小时摸索——xpath不是我的强项!是的,尽管页面上还有其他H1元素,我需要知道哪些值与哪个标题对应。如果您没有考虑XPATH,将进行调查,谢谢。如果您发布您正在解析的内容以及您需要的内容。我相信有人可以用xpath为您指出正确的方向。很抱歉,我花了这么长时间才回到这里,但这太棒了,正是我所需要的:)我花了大约一个小时摸索——xpath不是我的强项!这是一个很好的简单解决方案,但与