我正在尝试使用BeautifulSoup4打印新闻文章的内容。
网址为:Link
我所拥有的当前代码如下所示,它提供了所需的输出:
page = requests.get('http://www.thehindu.com/news/national/People-showing-monumental-patience-queuing-up-for-a-better-India-says-Venkaiah/article16447029.ece')
soup = BeautifulSoup(page.content, 'html.parser')
article_text = ""
table = soup.find_all("div",{ "id": "content-body-14266949-16447029"})
for element in table:
article_text += ''.join(element.find_all(text = True)) + "\n\n"
print(article_text)
然而,问题是我想要抓取多个页面,并且每个页面都有不同的内容正文编号,格式为xxxxxxxx-xxxxxxxx(2个8位数的数据块。)
我尝试用正则表达式替换soup.find_all命令:
table = soup.find_all(text = re.compile(" content-body -........-........"))
但这会出错:
AttributeError:' NavigableString'对象没有属性' find_all'
有人可以指导我做什么吗?
谢谢。
答案 0 :(得分:2)
您可以使用lxml来使用提取内容 lxml库允许您使用xpath从html中提取内容
from lxml import etree
selector=etree.HTML(pageText)
article_text=selector.xpath('//div[@class="article-block-multiple live-snippet"]/div[1]')[0].text
我不使用BeautifulSoup。我想你可以像这样使用BeautifulSoup
table = soup.find_all("div",{ "class": "article-block-multiple live-snippet"]"})
然后使用find子元素,找到第一个div元素
答案 1 :(得分:2)
正则表达式应该没问题!尝试
table = soup.find_all("div",{ "id": re.compile('content-body-*')})
答案 2 :(得分:1)
另一种方法可能是使用css选择器。选择器很干净,非常重要。你也可以尝试一下。只需更改" url"与你有关的链接。
import requests ; from bs4 import BeautifulSoup
res = requests.get(url).text
soup = BeautifulSoup(res,"html.parser")
for item in soup.select("div[id^=content-body-] p"):
print(item.text)