请考虑以下代码:
from lxml import html
import requests
page = requests.get('https://advisorless.substack.com/?no_cover=true')
tree = html.fromstring(page.content)
在HTML中,相关部分类似于:
<div class="body markup">
<p>123</p>
<a href=''>456</a>
</div>
<div class="body markup">
<p>ABC</p>
<p>DEF</p>
</div>
尝试1
tree.xpath('//div[@class="body markup"]/descendant::*/text()')
产生以下结果:['123', '456', 'ABC', 'DEF']
尝试2
tree.xpath('//div[@class="body markup"]/descendant::*/text()')[0]
产生以下结果:['123']
我想要得到的东西 ['123', '456']
我不确定是否可以使用同级选择器而不是后代来完成
对于特定URL:
以下来自Inspect Element的代码是我想要的结果;尽管我的代码需要更动态的东西。其中div [3]是class =“ body markup”的div:
//*[@id="main"]/div[2]/div[2]/div[1]/div/article/div[3]/descendant::*/text()')
为了更加具体,这也可以:
//div[@class="post-list"]/div[1]/div/article[@class="post"]/div[@class="body markup"]/descendant::*/text()
这是我不知道如何修改的一个静态div。我敢肯定,有一个简单的东西我没有放在一起。
答案 0 :(得分:0)
我仍然不确定您要做什么,但让我们从此开始,让我知道如何修改结果(如果必要):
import requests
from lxml import html
url = "https://advisorless.substack.com/?no_cover=true"
resp = requests.get(url)
root = html.fromstring(resp.text)
targets = root.xpath("//div[@class='body markup'][./p][./a]")
for target in targets:
print(target.text_content())
for link in target.xpath('a'):
print(link.attrib['href'])
print('=====')
输出内容太长,无法在此处重现,但请查看它是否符合您的期望输出。