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表达式来实现我的需求吗?
答案 0 :(得分:1)
您在浏览器中看到的HTML与您用于下载页面的HTTP库不同。例如,如果我这样做:
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&t=1&t1=0&ss=&ct=&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)]