Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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 这个re.compile()表达式不应该找到页面中的所有链接吗?_Python_Parsing_Hyperlink - Fatal编程技术网

Python 这个re.compile()表达式不应该找到页面中的所有链接吗?

Python 这个re.compile()表达式不应该找到页面中的所有链接吗?,python,parsing,hyperlink,Python,Parsing,Hyperlink,我很难理解python中的re.compile方法。我找到了这个例子,从我读到的内容来看,应该可以找到一个网页中的所有链接。这是正确的吗?有人能解释一下吗?表达的一部分?这对我来说没有多大意义,而且似乎也无法在页面中找到链接 link_finder = re.compile('href="(.*?)"') links = link_finder.findall(html) 这是一个非贪婪表达式,用于匹配一对双引号之间的所有字符。非贪婪意味着一旦找到下一个双引号,它将停止搜索 相反,一个贪婪的表

我很难理解python中的re.compile方法。我找到了这个例子,从我读到的内容来看,应该可以找到一个网页中的所有链接。这是正确的吗?有人能解释一下吗?表达的一部分?这对我来说没有多大意义,而且似乎也无法在页面中找到链接

link_finder = re.compile('href="(.*?)"')
links = link_finder.findall(html)
这是一个非贪婪表达式,用于匹配一对双引号之间的所有字符。非贪婪意味着一旦找到下一个双引号,它将停止搜索

相反,一个贪婪的表情

"(.*)"
不会在它找到的下一个双引号处停止-它将继续,直到它到达当前行的最后一个引号-因此使用贪婪这个词,而不是本例中所需的

它可能找不到任何适合您的内容,因为您的所有链接都使用单引号而不是双引号引用。那样的话,试试看

link_finder = re.compile("href='(.*?)'")
请注意,单引号和双引号的位置是交换的

示例输出:

>>> link_finder = re.compile("href='(.*?)'")
>>> links = link_finder.findall("<a href='testlink'>")
>>> links
['testlink']
它将匹配空格以及两种类型的引号。但是,正如Ken Hampson所建议的那样,更好的方法是使用专用工具,或者。

要真正找到文档中的所有HTML链接,它比正则表达式所支持的更细微

例如,以下任一标记都是有效的HTML:

<a href='foo.html'>foo</a>

<a href = 'foo2.html'>foo2</a>
但是,除了单引号对和双引号对之外,还有其他细微差别。这只是另一个例子,这又回到了使用正则表达式解析HTML或XML等内容的整个过程中。。最好使用一个实际的HTML解析器来实现这一点,因为所有这些细微差别都被考虑进去了,因为解析器必须考虑语言的整个语法

如果您在web上下文中操作,jQuery实际上可能是最好的选择,因为它将通过一行程序搜索DOM


对于纯Python,lxml是一种可能性。

谢谢!!!这解释了很多。我在任何地方都找不到这样的简化。使用beautifulsoup,忘记用regexYa解析html,这就是我要做的。
re.compile("href\s*=\s*['\"](.*?)['\"]")
<a href='foo.html'>foo</a>

<a href = 'foo2.html'>foo2</a>
link_finder = re.compile("href\s*=\s*'(.*?)'")