关于python爬虫的问题

我想用xpath爬取名称栏下的所有名称代码如下

import requests
from lxml import etree
import pandas as pd

 
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
lists = []

for i in range(1):
    url = "https://www.nppa.gov.cn/nppa/contents/320/106516.shtml"
    response = requests.get(url,headers=header).content
    # print(response.text)
    html = etree.HTML(response)
    result = html.xpath('/html/body/div[2]/div[4]/div[2]/div[2]/table[2]/tr')
    print(result)



    for results in result:
        title = results.xpath("./td[1]/text()")[0]
        print(title)

结果只能爬取到‘序号’这一个文本。更改result 一行的最后一个tr标签为tr[1]结果仍然是输出‘序号’
更改为tr[2]之后输出结果为空列表,求解惑

该回答引用ChatGPT4与博主@晓码自在合作编写:

从你的代码和描述来看,有几个可能的原因导致无法正确爬取名称:

  1. XPath表达式错误。表达式/html/body/div[2]/div[4]/div[2]/div[2]/table[2]/tr匹配到的可能是表格的表头,而非具体内容,所以只能获取到“序号”文本。需要修改XPath表达式匹配具体内容的行。
  2. tr[2]匹配不到任何节点。如果表格结构过于复杂,tr[2]可能无法正确匹配,导致结果为空列表。需要分析表格结构,找出正确的节点匹配表达式。
  3. 返回的response内容不完整。如果网络原因导致返回的response内容不完整,解析的DOM树也不完整,XPath无法正确匹配到节点,从而无法获取名称。需要检查response内容的完整性。

要解决这个问题,你可以:

  1. 分析表格结构,尝试不同的XPath匹配行内容的表达式,替换结果,例如:
    python
    result = html.xpath('/html/body/div[2]/div[4]/div[2]/div[2]/table[2]/tr[3]/td')
  2. 使用开发者工具查看表格HTML结构,找到包含名称内容的节点,然后构建正确的XPath。
  3. 检查返回的response内容是否完整,如果不完整可能需要处理异常并重新请求。
  4. 作为Fallback方案,可以尝试使用BeautifulSoup等其他解析库解析response内容,该库在解析不规范HTML时表现更强大,可能能够获取到名称内容。

我认为原因1和2更大概率导致你的问题。你可以根据我提供的思路和示例,调整XPath表达式,最终获取到正确的名称内容