使用Python LXML XPath刮取数据

时间:2013-02-12 19:19:34

标签: python html-parsing lxml

我正在尝试解析网站

blahblahblah 
<a  href="THIS IS WHAT I WANT" title="NOT THIS">I DONT CARE ABOUT THIS EITHER</a>
blahblahblah 

(其中有很多,我希望所有这些都以一种标记化的形式)。问题是“a href”实际上有两个空格,而不仅仅是一个空格(有一些是“href”,有一个我不想检索的空格),所以使用tree.xpath('// a / @ href')不太有用。有没有人对如何做有任何建议?

谢谢!

4 个答案:

答案 0 :(得分:0)

不了解LXML,但你绝对可以使用BeautifulSoup,在页面上找到所有<a>,然后创建一个for循环,在那里你将检查<a href=...>是否与你的正则表达式模式匹配,如果匹配,则为废弃网址。

答案 1 :(得分:0)

此代码按预期工作:

from lxml import etree

file = "file:///path/to/file.html" # can be a http URL too
doc = etree.parse(file)

print doc.xpath('//a/@href')[0]

编辑:AFAIK无法通过lxml执行您想要的操作。

您可以使用代替。

答案 2 :(得分:0)

“(有一些是”href“,有一个我不想检索的空间)”

我认为这意味着你只想找到a和href之间有多个空格的元素。 XML允许标记名称和属性之间的任何数量的空格(空格,制表符,新行都是允许的)。在解析文本并创建文档树时,将丢弃空格。 LXML和XPATH正在使用Document树中的Node对象,而不是解析为生成树的原始文本。

一种选择是使用正则表达式来查找所需的文本。但实际上,由于这是完全有效的XML / HTML,为什么还要删除一些空格?

答案 3 :(得分:0)

使用xpath表达式查找所有节点,然后遍历查找匹配项的所有节点,您可以获取节点的字符串表示形式:

etree.tostring(node)

进一步参考:http://lxml.de/tutorial.html#elements-carry-attributes-as-a-dict