python - 如何使用 xpath 为这种 html 提取所有常规段落?

标签 python html xpath html-parsing

url = "http://news.xinhuanet.com/english/2016-07/14/c_135513513.htm " 我想提取新闻的所有常规段落,即所有标签 <p>没有任何归因。我使用:

hxs = etree.HTML(cleaner.clean_html(page))
content = [p.xpath("normalize-space(.)") for p in hxs.xpath("//span[@id='content']/p[not(@*)]")]

但是里面第一个内容<p>还提取了带有属性的标签。 你能给我一个正确的更好的xpath表达式来实现我的需求吗?

最佳答案

您在浏览器中看到的 HTML 与您通过用于下载页面的 HTTP 库获得的 HTML 不同。例如,如果我这样做:

import requests

url = "http://news.xinhuanet.com/english/2016-07/14/c_135513513.htm"
response = requests.get(url)
print(response.content)

“内容”中的第一段将是:

<p><img id="{E6CB4B95-0D91-45A9-BC63-AD69A87272FC}" title="" style="HEIGHT: 683px; WIDTH: 900px" hspace="0" alt="" src="135513513_14685061164641n.jpg" width="900" height="683" sourcename="本地文件" sourcedescription="网上抓取的文件" /> <br /><br /><font style="FONT-SIZE: 10pt" color="navy" size="1">ULAN BATOR, July 14, 2016 (Xinhua) -- Chinese Premier <a href="http://search.news.cn/language/search.jspa?id=en&amp;t=1&amp;t1=0&amp;ss=&amp;ct=&amp;n1=Li+Keqiang">Li Keqiang</a> (R) meets with Latvian President Raimonds Vejonis in Ulan Bator, Mongolia, July 14, 2016. (Xinhua/Wang Ye)</font> </p>

如您所见,它没有属性,因此与您的 XPath 表达式匹配。

您需要一种不同的方法来跳过此类段落。例如,您可以跳过不包含 img 子元素的段落:

//span[@id='content']/p[not(@*) and not(img)]

关于python - 如何使用 xpath 为这种 html 提取所有常规段落?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38378943/

相关文章:

html - 无法显示内联 li 元素

javascript - 如何更改在子类中有设置的宽度/高度元素

javascript - 从PHP中的字符串获取多个图像src

python - 调试python3中无效的utf-8字符

python - 在 python 和 gettext 中切换翻译

python - 在 PyParsing 中,如何将可选解析结果转换为整数或 None(如果不存在)

html - 背景图片不显示

xml - 获取嵌套节点中唯一的 XPath 节点值

xslt - 高效 xpath 选择器的最佳实践

python - 找到最重复的! np.数组!在列表中